home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
et
/
et3_0-a1.lha
/
et3
/
src
/
AccessMem.C
next >
Wrap
C/C++ Source or Header
|
1992-07-17
|
3KB
|
139 lines
#ifdef __GNUG__
#pragma implementation
#endif
#include "AccessMem.h"
#include "Class.h"
#include "Exception.h"
//---- AccessMembers ---------------------------------------------------------
AccessMembers::AccessMembers()
{
}
AccessMembers::~AccessMembers()
{
}
void AccessMembers::ClassName(char*)
{
}
void AccessMembers::Member(char *, int, int, int, Class*, bool, bool)
{
}
void AccessMembers::ScanMembers(Object *o, int first, va_list ap, int n)
{
int len, tag, size;
char *name;
Class *cl;
u_long th= (u_long) o, offset;
bool global= FALSE, lenglobal= FALSE;
if (o && o->IsA())
size= o->IsA()->Size();
else
size= 999999; // very large (good idea ???)
for (int i= 0; i < n; i++) {
if (i == 0)
tag= first;
else
tag= va_arg(ap, int);
if (tag == T_SIM)
tag= 0;
name= va_arg(ap, char*);
cl= va_arg(ap, Class*);
offset= va_arg(ap, u_long);
if (offset >= th && offset < th+size) {
offset-= th;
global= FALSE;
} else
global= TRUE;
if (tag & T_VEC) {
len= (int)va_arg(ap, u_long);
if (len >= th && len < th+size) {
len-= (int)th;
lenglobal= FALSE;
} else
lenglobal= TRUE;
} else if (tag & T_ARR)
len= va_arg(ap, int);
else
len= -1;
Member(name, (int) offset, len, tag, cl, global, lenglobal);
}
va_end(ap);
}
//---- AccessObjPtrs ----------------------------------------------------------
AccessObjPtrs::AccessObjPtrs(Object *op)
{
inObject= op;
}
void AccessObjPtrs::ForObject(Object *op)
{
inObject= op;
}
void AccessObjPtrs::Member(char *name, int offset, int offsetOrLen, int type,
Class *cl, bool global, bool lenglobal)
{
if (cl && cl->TestFlag(eClassObject)) {
if ((type & T_PTR2) && (type & (T_ARR | T_VEC))) {
Object **ov;
int l= 0;
if (type & T_ARR)
l= offsetOrLen;
else if (type & T_VEC) {
void *ll;
if (lenglobal)
ll= (void*) offsetOrLen;
else
ll= (void*) ((u_long) inObject + (u_long) offsetOrLen);
TRY {
l= *((int*)ll);
} CATCH(ex) {
l= -1;
} ENDTRY;
}
if (global)
ov= *(Object***) offset;
else
ov= *(Object***)((u_long) inObject + (u_long) offset);
if (ov && l > 0)
for (int i= 0; i < l; i++)
if (ov[i])
FoundPointer(ov[i], name, i, FALSE);
} else if (type & T_PTR) {
if (global)
FoundPointer(*(Object**)((u_long) offset), name, -1, TRUE);
else
FoundPointer(*(Object**)((u_long) inObject + (u_long) offset), name, -1, FALSE);
} else if (type == 0) { // inline Object
if (global)
FoundPointer((Object*)((u_long) offset), name, -1, TRUE);
else
FoundPointer((Object*)((u_long) inObject + (u_long) offset), name, -1, FALSE);
}
}
}
void AccessObjPtrs::FoundPointer(Object*, char*, int, bool)
{
}